package Controllers.Administrativo;

import Daos.NoticiaDao;
import Model.Noticia;
import Util.AuthenticateData;
import Util.Message;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 *
 * @author Max
 */
@WebServlet(name = "ServletNoticia", urlPatterns = {"/adm/noticia"})
public class ServletNoticia extends HttpServlet {

    private NoticiaDao noticiaDao = new NoticiaDao();
    private Noticia noticia;
    private ArrayList<Message> messages;
    private RequestDispatcher dispatcher;
    private String action;

    /**
     * Handles the HTTP
     * <code>GET</code> method. Actions que vem por get indicam páginas. Todas
     * as requisições por get devem ser redirecionadas com RequestDispatcher
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        action = request.getParameter("action");
        messages = new ArrayList<>();

        if (action != null) {
            switch (action) {
                case "create":
                    dispatcher = request.getRequestDispatcher("/adm/noticiaCreate.jsp");
                    dispatcher.forward(request, response);
                    break;

                case "update":
                    noticia = noticiaDao.get(Long.parseLong(request.getParameter("id")));

                    if (noticia == null) {
                        response.sendError(404);
                    } else {
                        request.setAttribute("noticia", noticia);
                        dispatcher = request.getRequestDispatcher("/adm/noticiaUpdate.jsp");
                        dispatcher.forward(request, response);
                    }
                    break;

                case "remove":
                    noticia = noticiaDao.get(Long.parseLong(request.getParameter("id")));
                    if (noticia == null) {
                        response.sendError(404);
                    }else{
                        noticiaDao.remove(noticia.getId());
                        response.sendRedirect("noticia?action=search");
                    }
                    break;

                case "view":
                    boolean newNoticia = Boolean.parseBoolean(request.getParameter("new"));
                    boolean updatedNoticia = Boolean.parseBoolean(request.getParameter("updated"));
                    noticia = noticiaDao.get(Long.parseLong(request.getParameter("id")));

                    if (noticia == null) {
                        response.sendError(404);
                    } else {
                        if (newNoticia) {
                            messages.add(new Message("Notícia publicada com sucesso", Message.TYPE_SUCCESS));
                        }
                        if (updatedNoticia) {
                            messages.add(new Message("Notícia alterada com sucesso", Message.TYPE_INFO));
                        }

                        request.setAttribute("noticia", noticia);
                        request.setAttribute("messages", messages);

                        dispatcher = request.getRequestDispatcher("/adm/noticiaView.jsp");
                        dispatcher.forward(request, response);
                    }
                    break;

                case "search":
                    List<Noticia> noticias = noticiaDao.list();

                    if (noticias.isEmpty()) {
                        messages.add(new Message("Não foram encontrados resultados de busca", Message.TYPE_INFO));
                        request.setAttribute("messages", messages);
                    }

                    request.setAttribute("noticias", noticias);

                    dispatcher = request.getRequestDispatcher("/adm/noticiaSearch.jsp");
                    dispatcher.forward(request, response);
                    break;
            }
        }

    }

    /**
     * Handles the HTTP
     * <code>POST</code> method. Actions que vem por post indicam operações.
     * Todas as requisições por post devem ser redirecionadas com sendRedirect
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        action = request.getParameter("action");
        messages = new ArrayList<>();

        String titulo;
        String chamada;
        String texto;

        if (action != null) {
            switch (action) {
                case "create":
                    titulo = request.getParameter("titulo");
                    chamada = request.getParameter("chamada");
                    texto = request.getParameter("texto");
                    texto = texto.replaceAll("<div>", "<p>");
                    texto = texto.replaceAll("</div>", "</p>");

                    if (AuthenticateData.authenticateNotEmpty(titulo)) {
                        messages.add(new Message("O título não pode ser vazio", Message.TYPE_ERROR));
                    }
                    if (AuthenticateData.authenticateNotEmpty(texto)) {
                        messages.add(new Message("O texto não pode ser vazio", Message.TYPE_ERROR));
                    }

                    if (!messages.isEmpty()) {
                        request.setAttribute("messages", messages);
                        dispatcher = request.getRequestDispatcher("/adm/noticiaCreate.jsp");
                        dispatcher.forward(request, response);
                    } else {

                        noticia = new Noticia();
                        noticia.setTitulo(titulo);
                        noticia.setChamada(chamada);
                        noticia.setTexto(texto);
                        noticia.setDataHora(new Date());

                        noticiaDao.insert(noticia);

                        response.sendRedirect("noticia?action=view&new=true&id=" + noticia.getId());
                    }
                    break;

                case "update":
                    noticia = noticiaDao.get(Long.parseLong(request.getParameter("id")));

                    if (noticia == null) {
                        response.sendError(404);

                    } else {
                        titulo = request.getParameter("titulo");
                        chamada = request.getParameter("chamada");
                        texto = request.getParameter("texto");

                        if (AuthenticateData.authenticateNotEmpty(titulo)) {
                            messages.add(new Message("O título não pode ser vazio", Message.TYPE_ERROR));
                        }
                        if (AuthenticateData.authenticateNotEmpty(texto)) {
                            messages.add(new Message("O texto não pode ser vazio", Message.TYPE_ERROR));
                        }

                        if (!messages.isEmpty()) {
                            request.setAttribute("messages", messages);
                            dispatcher = request.getRequestDispatcher("/adm/noticiaCreate.jsp");
                            dispatcher.forward(request, response);

                        } else {
                            noticia.setTitulo(titulo);
                            noticia.setChamada(chamada);
                            noticia.setTexto(texto);

                            noticiaDao.update(noticia);

                            response.sendRedirect("noticia?action=view&updated=true&id=" + noticia.getId());
                        }
                    }
                    break;

                case "remove":
                    break;
                case "view":
                    break;
                case "search":
                    break;
                default:
                    response.sendError(404);
            }
        }
    }

    /**
     * Returns a short description of the servlet.
     *
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }
}
